{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# code:3-5\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 定义树结点格式常量\n",
    "decisionNode = dict(boxstyle=\"sawtooth\", fc=\"0.8\")\n",
    "leafNdoe = dict(boxstyle=\"round4\", fc=\"0.8\")\n",
    "arrow_args = dict(arrowstyle=\"<-\")\n",
    "\n",
    "def plot_node(nodeTxt, centerPt, parentPt, nodeType):\n",
    "    \"\"\"\n",
    "    实际的绘图\n",
    "    \"\"\"\n",
    "    createPlot.ax1.annotate(nodeTxt, xy=parentPt, xycoords='axes fraction', xytext=centerPt, \n",
    "                            textcoords='axes fraction', va=\"center\", ha=\"center\", bbox=nodeType, \n",
    "                            arrowprops=arrow_args) # annotate: 标注文字\n",
    "\n",
    "def createPlot():\n",
    "    # 创建新的图形，并清空绘图区\n",
    "    fig = plt.figure(1, facecolor='white')\n",
    "    fig.clf()\n",
    "    \n",
    "    # 绘制两个不同类型的树结点\n",
    "    createPlot.ax1 = plt.subplot(111, frameon=False)\n",
    "    plot_node(U'desion node', (0.5, 0.1), (0.1, 0.5), decisionNode)\n",
    "    plot_node(U'child node', (0.8, 0.1), (0.3, 0.8), leafNdoe)\n",
    "    plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "createPlot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# code 3-6\n",
    "def get_num_leafs(myTree):\n",
    "    \"\"\"\n",
    "    获取叶节点数目\n",
    "    \"\"\"\n",
    "    num_leafs = 0\n",
    "    first_str = list(myTree.keys())[0]\n",
    "    second_dict = myTree[first_str]\n",
    "    for key in second_dict.keys():\n",
    "        # 测试结点数据类型是否为字典\n",
    "        if type(second_dict[key]).__name__=='dict':\n",
    "            num_leafs += get_num_leafs(second_dict[key])\n",
    "        else:\n",
    "            num_leafs += 1\n",
    "    return num_leafs\n",
    "\n",
    "def get_tree_depth(myTree):\n",
    "    \"\"\"\n",
    "    获取树的深度\n",
    "    \"\"\"\n",
    "    max_depth = 0\n",
    "    first_str = list(myTree.keys())[0]\n",
    "    second_dict = myTree[first_str]\n",
    "    for key in second_dict.keys():\n",
    "        if type(second_dict[key]).__name__=='dict':\n",
    "            this_depth = 1 + get_tree_depth(second_dict[key])\n",
    "        else:\n",
    "            this_depth = 1\n",
    "        if this_depth > max_depth: max_depth = this_depth\n",
    "    return max_depth\n",
    "\n",
    "def retrieve_tree(i):\n",
    "    list_of_trees = [{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}},\n",
    "                     {'no surfacing': {0: 'no', 1: {'flippers': {0: {'head': {0: 'no', 1: 'yes'}}, 1: 'no'}}}}]\n",
    "    return list_of_trees[i]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'no surfacing': {0: 'no',\n",
       "  1: {'flippers': {0: {'head': {0: 'no', 1: 'yes'}}, 1: 'no'}}}}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "retrieve_tree(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3\n",
      "2\n"
     ]
    }
   ],
   "source": [
    "myTree = retrieve_tree(0)\n",
    "print(get_num_leafs(myTree))\n",
    "print(get_tree_depth(myTree))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "# code3-7 plotTree\n",
    "def plot_mid_text(cntrPt, parentPt, txt_string):\n",
    "    \"\"\"\n",
    "    父子节点之间填充文本信息\n",
    "    @cntrPt: 子节点位置(x, y)信息（tuple）\n",
    "    @parentPt: 父节点位置(x, y)信息（tuple）\n",
    "    \"\"\"\n",
    "    xMid = (parentPt[0]-cntrPt[0])/2.0 + cntrPt[0]\n",
    "    yMid = (parentPt[1]-cntrPt[1])/2.0 + cntrPt[1]\n",
    "    createPlot.ax1.text(xMid, yMid, txt_string)\n",
    "\n",
    "def plot_tree(myTree, parentPt, nodeTxt):\n",
    "    \"\"\"\n",
    "    绘图\n",
    "    \"\"\"\n",
    "    # 计算宽高\n",
    "    num_leafs = get_num_leafs(myTree)\n",
    "    depth = get_tree_depth(myTree)\n",
    "    first_str = list(myTree.keys())[0]\n",
    "    \n",
    "    # 标记子结点属性值\n",
    "    cntrPt = (plot_tree.xOff + (1.0 + float(num_leafs))/2.0/plot_tree.totalW, plot_tree.yOff)\n",
    "    plot_mid_text(cntrPt, parentPt, nodeTxt)\n",
    "    # 画节点\n",
    "    plot_node(first_str, cntrPt, parentPt, decisionNode)\n",
    "    # 减少y的偏移量，即更新深度\n",
    "    second_dict = myTree[first_str]\n",
    "    plot_tree.yOff = plot_tree.yOff - 1.0/plot_tree.totalD\n",
    "    # 递归绘图\n",
    "    for key in second_dict.keys():\n",
    "        if type(second_dict[key]).__name__=='dict':\n",
    "            plot_tree(second_dict[key], cntrPt, str(key))\n",
    "        else:\n",
    "            plot_tree.xOff = plot_tree.xOff + 1.0/plot_tree.totalW\n",
    "            plot_node(second_dict[key], (plot_tree.xOff, plot_tree.yOff), cntrPt, leafNdoe)\n",
    "            plot_mid_text((plot_tree.xOff, plot_tree.yOff), cntrPt, str(key))\n",
    "    # 回退y值\n",
    "    plot_tree.yOff = plot_tree.yOff + 1.0/plot_tree.totalD\n",
    "        \n",
    "def create_plot(inTree):\n",
    "    fig = plt.figure(1, facecolor='white')\n",
    "    fig.clf()\n",
    "    axprops = dict(xticks=[], yticks=[])\n",
    "    createPlot.ax1 = plt.subplot(111, frameon=False, **axprops)\n",
    "    \n",
    "    # plot_tree: 函数的全局变量\n",
    "    # 宽度： 叶子节点数\n",
    "    # 深度： 深度\n",
    "    plot_tree.totalW = float(get_num_leafs(inTree))\n",
    "    plot_tree.totalD = float(get_tree_depth(inTree))\n",
    "    # xOff、yOff用来追踪已绘制的节点位置\n",
    "    plot_tree.xOff = -0.5/plot_tree.totalW\n",
    "    plot_tree.yOff = 1.0\n",
    "    plot_tree(inTree, (0.5, 1.0), '')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "myTree = retrieve_tree(0)\n",
    "create_plot(myTree)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
